#pragma once

#include <AVUIKeyFrames.h>

namespace AVUI {

class LinearSingleKeyFrame : public TValueLinearKeyFrame<float, SingleKeyFrame>
{
public:
    DECLARE_ELEMENT(LinearSingleKeyFrame, SingleKeyFrame);

protected:
    virtual TRefCountedPtr<Freezable> CreateInstanceCore() AVUI_OVERRIDE { return object_allocate<LinearSingleKeyFrame>().get_Ptr(); }
};

class LinearDoubleKeyFrame : public TValueLinearKeyFrame<float, DoubleKeyFrame>
{
public:
    DECLARE_ELEMENT(LinearDoubleKeyFrame, DoubleKeyFrame);

protected:
    virtual TRefCountedPtr<Freezable> CreateInstanceCore() AVUI_OVERRIDE { return object_allocate<LinearDoubleKeyFrame>().get_Ptr(); }
};

class LinearPointKeyFrame : public TValueLinearKeyFrame<Point, PointKeyFrame>
{
public:
    DECLARE_ELEMENT(LinearPointKeyFrame, PointKeyFrame);

protected:
    virtual TRefCountedPtr<Freezable> CreateInstanceCore() AVUI_OVERRIDE { return object_allocate<LinearPointKeyFrame>().get_Ptr(); }
};

class LinearColorKeyFrame : public TValueLinearKeyFrame<Color, ColorKeyFrame>
{
public:
    DECLARE_ELEMENT(LinearColorKeyFrame, ColorKeyFrame);

protected:
    virtual TRefCountedPtr<Freezable> CreateInstanceCore() AVUI_OVERRIDE { return object_allocate<LinearColorKeyFrame>().get_Ptr(); }
};

class LinearVector3DKeyFrame : public TValueLinearKeyFrame<Vector3D, Vector3DKeyFrame>
{
public:
    DECLARE_ELEMENT(LinearVector3DKeyFrame, Vector3DKeyFrame);

protected:
    virtual TRefCountedPtr<Freezable> CreateInstanceCore() AVUI_OVERRIDE { return object_allocate<LinearVector3DKeyFrame>().get_Ptr(); }
};

class LinearPoint3DKeyFrame : public TValueLinearKeyFrame<Point3D, Point3DKeyFrame>
{
public:
    DECLARE_ELEMENT(LinearPoint3DKeyFrame, Point3DKeyFrame);

protected:
    virtual TRefCountedPtr<Freezable> CreateInstanceCore() AVUI_OVERRIDE { return object_allocate<LinearPoint3DKeyFrame>().get_Ptr(); }
};

class LinearRotation3DKeyFrame : public TReferenceLinearKeyFrame<Rotation3D, Rotation3DKeyFrame>
{
public:
    DECLARE_ELEMENT(LinearRotation3DKeyFrame, Rotation3DKeyFrame);

protected:
    virtual TRefCountedPtr<Freezable> CreateInstanceCore() AVUI_OVERRIDE { return object_allocate<LinearRotation3DKeyFrame>().get_Ptr(); }
};


}; // namespace AVUI
